﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Framework.AcessoDados.Acesso;
using Framework.Entidade.Acesso;
using Framework.Util.Enumerador;
using System.Configuration;

namespace Framework.LogicaNegocio.Acesso
{
    public class LN_Modulo
    {
        #region Métodos

        /// <summary>
        /// Método responsável pela listagem de todos os Modulos já cadastrados conforme filtro
        /// </summary>
        /// <param name="nome">Nome do Modulo</param>
        /// <param name="status">Status do Modulo</param>
        /// <returns>Lista de Objetos EN_Modulo preenchidos</returns>
        public List<EN_Modulo> Listar(string nome, string status)
        {
            AD_Modulo objModuloAD = new AD_Modulo();
            List<EN_Modulo> lstModulos = new List<EN_Modulo>();

            try
            {
                lstModulos = objModuloAD.Listar(nome, status);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstModulos;
        }

        /// <summary>
        /// Método responsável pelo retorno do Modulo desejado
        /// </summary>
        /// <param name="id">id do Modulo</param>
        /// <returns>Objeto EN_Modulo preenchido</returns>
        public EN_Modulo RetornarModulo(int id)
        {
            AD_Modulo objModuloAD = new AD_Modulo();
            EN_Modulo objModulo = new EN_Modulo();

            try
            {
                if (id <= 0)
                    throw new Exception("Informe o Id do Modulo.");

                objModulo = objModuloAD.RetornarModulo(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return objModulo;
        }

        /// <summary>
        /// Método responsável por Salvar o Modulo no Banco de Dados
        /// Insere ou Altera
        /// </summary>
        /// <param name="objModulo">Objeto Modulo preenchido</param>
        /// <returns>Id do Modulo</returns>
        public int Salvar(EN_Modulo objModulo)
        {
            AD_Modulo objModuloAD = new AD_Modulo();
            int idModulo = 0;

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (objModulo == null)
                        throw new Exception("Preencha as informações do Modulo.");
                    if (string.IsNullOrEmpty(objModulo.Nome) == true)
                        throw new Exception("Informe o Nome do Modulo.");
                    if (string.IsNullOrEmpty(objModulo.Descricao) == true)
                        throw new Exception("Informe a Descrição do Modulo.");
                    if (objModulo.Valor <= 0)
                        throw new Exception("Informe o Valor do Modulo.");

                    idModulo = objModuloAD.Salvar(objModulo, conn, trans);

                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }

            return idModulo;
        }

        /// <summary>
        /// Método responsável por Excluir/Inativar o Modulo desejado
        /// </summary>
        /// <param name="id">id do Modulo</param>
        public void Excluir(int id)
        {
            AD_Modulo objModuloAD = new AD_Modulo();

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (id <= 0)
                        throw new Exception("Informe o Id do Modulo.");

                    objModuloAD.Excluir(id, conn, trans);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }
        }

        #endregion
    }
}
